package com.breeze.leetcode.zjtd;

public class MaxDistanceOfTree {

    static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

    // 1. 情况一： 左子树的深度+右子树的深度 + 1

    // 2. 情况二： Math.max(左子树最大距离,右子树最大距离)

    // 最终最大距离 = Math.max(情况一,情况二)
    public static int getMaxDistance(Node head) {
        int[] depth = new int[1];
        return process(head, depth);
    }

    /**
     * 得到当前head树的两个节点最大距离,
     *
     * @param head
     * @param depth:由于需要用到树的深度，故深度写入该数组中
     * @return
     */
    private static int process(Node head, int[] depth) {
        if (head == null) {
            depth[0] = 0;
            return 0;
        }
        // 得到左子树的最大距离及高度
        int leftMaxDistance = process(head.left, depth);
        int leftDepth = depth[0];
        // 得到右子树的最大距离及高度
        int rightMaxDistance = process(head.right, depth);
        int rightDepth = depth[0];
        // 更新当前树的高度
        depth[0] = Math.max(leftDepth, rightDepth) + 1;
        // 情况1的结果
        int sit1 = leftDepth + rightDepth + 1;
        // 情况2的结果
        int sit2 = Math.max(leftMaxDistance, rightMaxDistance);
        // 取情况1和情况2的最大结果即为当前树的最大距离
        return Math.max(sit1, sit2);
    }

    public static void main(String[] args) {
        /**
         *             1
         *        2         3
         *      4   5     6   7
         *
         */
        Node head = new Node(1);
        head.left = new Node(2);
        head.right = new Node(3);
        head.left.left = new Node(4);
        head.left.right = new Node(5);
        head.right.left = new Node(6);
        head.right.right = new Node(7);
        System.out.println(MaxDistanceOfTree.getMaxDistance(head));
    }
}